/**
 * Application configuration
 */
import type { ProjectConfig } from "/#/config"

import { PROJ_CFG_KEY } from "/@/enums/cacheEnum"
import projectSetting from "/@/settings/projectSetting"

import { updateHeaderBgColor, updateSidebarBgColor } from "/@/logics/theme/updateBackground"
import { updateColorWeak } from "/@/logics/theme/updateColorWeak"
import { updateGrayMode } from "/@/logics/theme/updateGrayMode"
import { updateDarkTheme } from "/@/logics/theme/dark"
import { changeTheme } from "/@/logics/theme"

import { useAppStore } from "/@/store/modules/app"
import { useLocaleStore } from "/@/store/modules/locale"

import { getCommonStoragePrefix, getStorageShortName } from "/@/utils/env"

import { primaryColor } from "../../build/config/themeConfig"
import { Persistent } from "/@/utils/cache/persistent"
import { deepMerge } from "/@/utils"
import { ThemeEnum } from "/@/enums/appEnum"

// Initial project configuration
export function initAppConfigStore() {
  const localeStore = useLocaleStore()
  const appStore = useAppStore()
  let projCfg: ProjectConfig = Persistent.getLocal(PROJ_CFG_KEY) as ProjectConfig
  projCfg = deepMerge(projectSetting, projCfg || {})
  const darkMode = appStore.getDarkMode
  const {
    colorWeak,
    grayMode,
    themeColor,

    headerSetting: { bgColor: headerBgColor } = {},
    menuSetting: { bgColor } = {},
  } = projCfg
  try {
    if (themeColor && themeColor !== primaryColor) {
      changeTheme(themeColor)
    }

    grayMode && updateGrayMode(grayMode)
    colorWeak && updateColorWeak(colorWeak)
  } catch (error) {
    console.log(error)
  }
  appStore.setProjectConfig(projCfg)

  // init dark mode
  updateDarkTheme(darkMode)
  if (darkMode === ThemeEnum.DARK) {
    updateHeaderBgColor()
    updateSidebarBgColor()
  } else {
    headerBgColor && updateHeaderBgColor(headerBgColor)
    bgColor && updateSidebarBgColor(bgColor)
  }
  // init store
  localeStore.initLocale()

  setTimeout(() => {
    clearObsoleteStorage()
  }, 16)
}

/**
 * As the version continues to iterate, there will be more and more cache keys stored in localStorage.
 * This method is used to delete useless keys
 */
export function clearObsoleteStorage() {
  const commonPrefix = getCommonStoragePrefix()
  const shortPrefix = getStorageShortName()

  ;[localStorage, sessionStorage].forEach((item: Storage) => {
    Object.keys(item).forEach((key) => {
      if (key && key.startsWith(commonPrefix) && !key.startsWith(shortPrefix)) {
        item.removeItem(key)
      }
    })
  })
}
